package cn.xzqwjw.taskmanager.controller.api;

import cn.xzqwjw.taskmanager.domain.pojo.Task;
import cn.xzqwjw.taskmanager.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

/**
 * @author wjw
 */
@Validated
@RestController
@RequestMapping("/api/task")
public class TaskApiController {

  private final TaskService taskService;

  @Autowired
  public TaskApiController(TaskService taskService) {
    this.taskService = taskService;
  }

  /**
   * 处理 "/api/task" 的 POST 请求，添加任务
   */
  @PostMapping("")
  public String add(
      @NotNull(message = "参数不能为空")
      @Valid @RequestBody Task task) {
    return taskService.add(task);
  }

  /**
   * 处理 "/api/task/{id:[0-9]+}" 的 DELETE 请求，删除任务
   */
  @DeleteMapping("/{idTask:[0-9]+}")
  public String delById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable int idTask) {
    return taskService.delById(idTask);
  }

  /**
   * 处理 "/api/task" 的 PUT 请求，修改任务
   */
  @PutMapping("")
  public String modifyAll(
      @NotNull(message = "参数不能为空")
      @Valid @RequestBody Task task) {
    return taskService.modifyAll(task);
  }

  /**
   * 处理 "/api/task" 的 PATCH 请求，设置任务状态
   * type = "enabled" 修改启用状态
   * type = "finished" 修改完成状态
   * type = "status" 修改审核状态
   */
  @PatchMapping("/{idTask:[0-9]+}")
  public String patchStatus(
      @NotNull(message = "任务id不能为空")
      @Min(value = 1, message = "任务id必须大于0")
      @PathVariable int idTask,
      @NotNull(message = "操作类型不能为空")
      @RequestParam(value = "Type") String type,
      @RequestParam(value = "Status", defaultValue = "") String status) {
    return taskService.patchStatus(idTask, type, status);
  }

  // ==================== 查询 ====================

  /**
   * 根据文章id查询得到某个文章的详情
   */
  @GetMapping("/{id:[0-9]+}")
  public String queryById(
      @NotNull(message = "id不能为空")
      @Min(value = 1, message = "id必须大于0")
      @PathVariable Integer id) {
    return taskService.queryById(id);
  }

  /**
   * 分页获取所有任务
   * url类似：/list-page?PageCurrent=2&PageSize=3
   */
  @GetMapping("/list-page")
  public String listPage(
      @RequestParam(value = "PageCurrent", defaultValue = "1") Integer pageCurrent,
      @RequestParam(value = "PageSize", defaultValue = "20") Integer pageSize) {
    return taskService.listPage(pageCurrent, pageSize);
  }

}
